from __future__ import print_function, unicode_literals

from datetime import datetime, timedelta
import pytest
import time
import wee_slack
import os

os.environ["TZ"] = "UTC"


@pytest.mark.parametrize(
    "case",
    (
        {
            "input": "foo",
            "output": "foo",
        },
        {
            "input": "<!channel>",
            "output": "@channel",
        },
        {
            "input": "<!everyone>",
            "output": "@everyone",
        },
        {
            "input": "<!group>",
            "output": "@group",
        },
        {
            "input": "<!here>",
            "output": "@here",
        },
        {
            "input": "<@U407ABLLW|@othernick>: foo",
            "output": "@alice: foo",
        },
        {
            "input": "<@UNKNOWN|@othernick>: foo",
            "output": "@othernick: foo",
        },
        {
            "input": "foo <#C407ABS94|otherchannel> foo",
            "output": "foo #general foo",
        },
        {
            "input": "foo <#UNKNOWN|otherchannel> foo",
            "output": "foo #otherchannel foo",
        },
        {
            "input": "url: <https://example.com|fallback> suffix",
            "output": "url: https://example.com suffix",
            "ignore_alt_text": True,
        },
        {
            "input": "url: <https://example.com|example> suffix",
            "output": "url: https://example.com (example) suffix",
            "auto_link_display": "both",
        },
        {
            "input": "url: <https://example.com|example with spaces> suffix",
            "output": "url: https://example.com (example with spaces) suffix",
            "auto_link_display": "both",
        },
        {
            "input": "url: <https://example.com|example.com> suffix",
            "output": "url: https://example.com (example.com) suffix",
            "auto_link_display": "both",
        },
        {
            "input": "url: <mailto:name@example.com|name@example.com> suffix",
            "output": "url: mailto:name@example.com (name@example.com) suffix",
            "auto_link_display": "both",
        },
        {
            "input": "url: <https://example.com|example.com> suffix",
            "output": "url: example.com suffix",
            "auto_link_display": "text",
        },
        {
            "input": "url: <https://example.com|different text> suffix",
            "output": "url: https://example.com (different text) suffix",
            "auto_link_display": "text",
        },
        {
            "input": "url: <mailto:name@example.com|name@example.com> suffix",
            "output": "url: name@example.com suffix",
            "auto_link_display": "text",
        },
        {
            "input": "url: <https://example.com|different text> suffix",
            "output": "url: https://example.com (different text) suffix",
            "auto_link_display": "url",
        },
        {
            "input": "url: <https://example.com|example.com> suffix",
            "output": "url: https://example.com suffix",
            "auto_link_display": "url",
        },
        {
            "input": "url: <mailto:name@example.com|name@example.com> suffix",
            "output": "url: mailto:name@example.com suffix",
            "auto_link_display": "url",
        },
        {
            "input": "<@U407ABLLW> multiple unfurl <https://example.com|example with spaces>",
            "output": "@alice multiple unfurl https://example.com (example with spaces)",
            "auto_link_display": "both",
        },
        {
            "input": "url with equal fallback: <https://example.com|https://example.com> suffix",
            "output": "url with equal fallback: https://example.com suffix",
            "auto_link_display": "both",
        },
        {
            "input": "try the #general channel",
            "output": "try the #general channel",
        },
        {
            "input": "<@U407ABLLW> I think 3 > 2",
            "output": "@alice I think 3 > 2",
        },
        {
            "input": "<!subteam^TGX0ALBK3|@othersubteam> This is announcement for the dev team",
            "output": "@test This is announcement for the dev team",
        },
        {
            "input": "<!subteam^UNKNOWN|@othersubteam> This is announcement for the dev team",
            "output": "@othersubteam This is announcement for the dev team",
        },
        {
            "input": "Ends <!date^1577880000^{date_num} - {date} - {date_short} - {date_long}|Jan 01, 2020>.",
            "output": "Ends 2020-01-01 - January 01, 2020 - Jan 01, 2020 - Wednesday, January 01, 2020.",
        },
        {
            "input": "Ends <!date^1577880000^{time} - {time_secs}|12:00 PM>.",
            "output": "Ends 12:00 - 12:00:00.",
        },
        {
            "input": "Ends <!date^1577880000^{date_num} {invalid_token}>.",
            "output": "Ends 2020-01-01 {invalid_token}.",
        },
        {
            "input": "Ends <!date^1577880000^{date_num}^http://github.com>.",
            "output": "Ends 2020-01-01 (http://github.com).",
        },
        {
            "input": "Ends <!date^{}^{{date_pretty}} - {{date_short_pretty}} - {{date_long_pretty}}>.".format(
                int(time.mktime(datetime.today().timetuple()))
            ),
            "output": "Ends today - today - today.",
        },
        {
            "input": "Ends <!date^{}^{{date_pretty}} - {{date_short_pretty}} - {{date_long_pretty}}>.".format(
                int(time.mktime((datetime.today() - timedelta(days=1)).timetuple()))
            ),
            "output": "Ends yesterday - yesterday - yesterday.",
        },
        {
            "input": "Ends <!date^{}^{{date_pretty}} - {{date_short_pretty}} - {{date_long_pretty}}>.".format(
                int(time.mktime((datetime.today() + timedelta(days=1)).timetuple()))
            ),
            "output": "Ends tomorrow - tomorrow - tomorrow.",
        },
        {
            "input": "Ends <!date^1577880000^{date_pretty} - {date_short_pretty} - {date_long_pretty}>.",
            "output": "Ends January 01, 2020 - Jan 01, 2020 - Wednesday, January 01, 2020.",
        },
    ),
)
def test_unfurl_refs(case, realish_eventrouter):
    wee_slack.EVENTROUTER = realish_eventrouter
    wee_slack.config.unfurl_ignore_alt_text = case.get("ignore_alt_text")
    wee_slack.config.unfurl_auto_link_display = case.get("auto_link_display")

    result = wee_slack.unfurl_refs(case["input"])
    assert result == case["output"]
